/// <reference path="jquery.min.js" />
$.extend({
  HTTP: {
    //验证接口正确性
    validRequest: function(data) {
      if (data.hasOwnProperty("errCode")) {
        if (data.errCode > 0 || data.errCode < 0) {
          return false;
        }
      }
      return true;
    },
    /*
         * url 请求地址
         * data 请求参数
         * sufun 回调函数
         * opts 重写ajax请求参数
         */
    request: function(url, data, sufun, opts) {
      var baseURL = "http://api.manage.meiyungou.jshcn.cn/";
      url = baseURL + url;
      var auth_token = $.Cookies.get("O_Auth_Token");
      if (auth_token === undefined || auth_token == "" || auth_token == null) {
        auth_token = "";
      }
      sufun = Object.assign(
        {
          ok: function() {},
          err: function() {}
        },
        sufun
      );
      var o = $.extend(
        {
          url: url,
          data: JSON.stringify(data),
          headers: {
            "O-Auth-Token": auth_token
          },
          contentType: "application/json",
          type: "post",
          dataType: "json",
          success: function(data) {
            if ($.HTTP.validRequest(data)) {
              sufun.ok(data);
              return;
            }
            sufun.err(data);
          }
        },
        opts
      );
      $.ajax(o);
    },

    /*
         * ajax 调用 返回json
         * url 请求地址
         * data 数据
         * sufu 成功回调
         * opts 可选参数 参考jquery ajax参数设置
         *  当使用 complete回调后，会多加一个close(index)回调方法 index=关闭弹层的索引
         */
    post: function(url, data, sufu, opts) {
      opts = Object.assign(
        {
          msg: "...",
          jquery: {}
        },
        opts
      );
      if (typeof opts.msg == "string") {
        $.showLoading(msg);
      }
      this.request(url, data, sufu, opts.jquery);
    },

    /*
         * ajax 调用 返回text
         * url 请求地址
         * data 数据
         * sufu 成功回调
         * opts 可选参数 参考jquery ajax参数设置
         */
    get: function(url, data, sufu, opts) {
      opts = Object.assign(
        {
          msg: "...",
          jquery: {
            type: "get"
          }
        },
        opts
      );
      if (typeof opts.msg == "string") {
        $.showLoading(msg);
      }
      this.request(url, data, sufu, opts.jquery);
    }
  }
});

// 使用 $.Cache.add(key,data)
$.extend({
  //使用localStorage缓存
  Cache: {
    /**
     * 添加一个缓存值
     * key 缓存键
     * data 缓存数据
     */
    add: function(key, data) {
      localStorage.setItem(key, data);
    },
    /**
     * 获取一个缓存值
     * key 缓存键
     */
    get: function(key) {
      return localStorage.getItem(key);
    },
    /**
     * 判断某一个缓存键是否存在
     * key 缓存键
     * 返回 bool 类型
     */
    exists: function(key) {
      if ($.Cache.get(key) === undefined) {
        return false;
      }
      return true;
    },
    /**
     * 移除一个缓存数据
     * key 缓存键
     */
    remove: function(key) {
      localStorage.removeItem(key);
    }
  },
  /*
     * 计算页码分析
     */
  CalculatePage: function(pageCount, pageSize) {
    return parseInt(
      pageCount % pageSize == 0
        ? pageCount / pageSize
        : pageCount / pageSize + 1
    );
  }
});

// 使用 Session
$.extend({
  Session: {
    /*
         * HTML5Session 储存  sessionStorage
         */
    add: function(key, data) {
      sessionStorage.setItem(key, data);
    },
    /*
         * 获取 session 储存  sessionStorage    
         */
    get: function(key) {
      sessionStorage.getItem(key);
    },
    /**
     * 判断某一个缓存键是否存在
     * key 键
     * 返回 bool 类型
     */
    exists: function(key) {
      if (this.get(key) === undefined) {
        return false;
      }
      return true;
    },
    /**
     * 移除session值
     * key 键
     */
    remove: function(key) {
      sessionStorage.removeItem(key);
    }
  }
});

//使用 Cookies
$.extend({
  Cookies: {
    /**
     * 添加一个缓存值
     * key 键
     * data 值
     * expires 过期时间
     */
    add: function(key, data, expires) {
      if (expires === undefined) {
        expires = 315360000;
      }
      Cookies.set(key, data, {
        expires: expires
      });
    },
    /**
     * 获取一个缓存值
     * key 键
     */
    get: function(key) {
      return Cookies.get(key);
    },
    /**
     * 判断某一个Cookies键是否存在
     * key 键
     * 返回 bool 类型
     */
    exists: function(key) {
      if (this.get(key) === undefined) {
        return false;
      }
      return true;
    },
    /**
     * 移除一个Cookies值
     * key 键
     */
    remove: function(key) {
      Cookies.set(key, data, {
        expires: -1
      });
    }
  }
});

//计算页码
$.extend({
  /**
   * pageCount 数据总是
   * pageSize 当前页
   */
  PageCalculate: function(pageCount, pageSize) {
    return parseInt(
      pageCount % pageSize == 0
        ? pageCount / pageSize
        : pageCount / pageSize + 1
    );
  }
});

/*
 * 下拉刷新 请求接口
 *  url:请求地址
 *  sufu：成功回调函数(没有数据时,该回调函数不会被调起)
 *  params：查询参数 params.Page不能被重写
 *  params.Page.Index: 分页开始 默认=1
 *  opts.emsg 设置显示没有数据提示内容 默认=没有更多内容了
 *  opts.jquery：是一个jquery 扩展参数
 */
$.fn.HttpPullToRefresh = function(url, params, sufu, opts) {
  var _this = this;
  //默认加载
  var _data = $.extend(
    {
      Page: {
        Index: 1
      }
    },
    params
  );
  opts = Object.assign(
    {
      jquery: {},
      emsg: "没有更多内容了"
    },
    opts
  );

  var loading = true; //是否允许加载
  //内部请求
  function _Request(data) {
    $.HTTP.request(
      url,
      data,
      {
        ok: function(d) {
          var ps = $.PageCalculate(d.DataCount, d.PageSize);
          if (_data.Page.Index >= ps) {
            sufu(d);
            $.toast(opts.emsg, "text");
            //重置刷新状态
            $(_this).pullToRefreshDone();
            loading = false;
            return;
          }
          sufu(d);
          //重置刷新状态
          $(_this).pullToRefreshDone();
        }
      },
      opts.jquery
    );
  }
  //首次加载
  _Request(_data);
  _this.pullToRefresh().on("pull-to-refresh", function() {
    if (loading == false) {
      $.toast(opts.emsg, "text");
      $(_this).pullToRefreshDone();
      return;
    }
    _data.Page.Index++;
    _Request(_data);
  });
};

/*
 *  滚动无限刷新 请求接口 
 *  url:请求地址
 *  sufu：成功回调函数(没有数据时,该回调函数不会被调起)
 *  params：外带额外的参数，比如条件查询
 *  params.Page:分页参数对象 不能被重写
 *  opts.jquery：是一个jquery 扩展参数
 *  opts.edistance 设置滚动多少PX触发它
 */
$.fn.HttpInfinite = function(url, params, sufu, opts) {
  var $this = this;
  var _load = $this.find("div[data-infinite='load']");
  var _data = $.extend(
    {
      Page: {
        Index: 1
      }
    },
    params
  );

  function changeLaod(type) {
    switch (type) {
      case -1:
        _load.addClass("weui-loadmore_line");
        _load.children("span[data-infinite='text']").text("没有更多数据");
        _load.children("i").remove();
        break;
      case 0:
        _load.children("span[data-infinite='text']").text("滑动加载更多");
        break;
      case 1:
        _load.children("span[data-infinite='text']").text("正在加载...");
        break;
    }
  }
  var loading = true; //是否允许加载
  opts = Object.assign(
    {
      jquery: {
        beforeSend: function() {
          if (loading == false) {
            return;
          }
          loading = false;
          changeLaod(1);
        }
      },
      edistance: null
    },
    opts
  );

  //
  function _Request(data) {
    $.HTTP.request(
      url,
      data,
      {
        ok: function(d) {
          var ps = $.CalculatePage(d.DataCount, d.PageSize);
          if (_data.Page.Index == 1 && ps == 1) {
            sufu(d);
            changeLaod(-1);
            loading = false;
            return;
          }
          if (_data.Page.Index >= ps) {
            sufu(d);
            changeLaod(-1);
            loading = false;
            return;
          }
          changeLaod(0);
          loading = true;
          sufu(d);
        }
      },
      opts.jquery
    );
  }
  _Request(_data);
  //滚动
  $this.infinite(opts.edistance).on("infinite", function() {
    if (loading == false) return;
    _data.Page.Index++;
    _Request(_data);
  });
};

/*
 * 扩展 "{0},{1}".Foramt(value,value)
 */
String.prototype.Format = function() {
  if (arguments.length == 0) return this;
  for (var s = this, i = 0; i < arguments.length; i++)
    s = s.replace(
      new RegExp("\\{" + i + "\\}", "g"),
      arguments[i] == null ? "" : arguments[i]
    );
  return s;
};

/*
 * 格式化时间 JS JSON格式
 * 参数 格式化类型
 * 依赖 moment.js
 */
Date.prototype.Dateformat = function(o) {
  if (o === undefined) {
    o = "YYYY年MM月DD日 HH:mm:ss a";
  }
  return moment(this.slice()).format(o);
};
/*
 * 格式化时间 JS JSON格式
 * 参数 格式化类型
 * 依赖 moment.js
 */
String.prototype.Dateformat = function(o) {
  if (o === undefined) {
    o = "YYYY年MM月DD日 HH:mm:ss a";
  }
  return moment(this.slice()).format(o);
};

/**
 * 获取url参数
 * @param name
 */
String.prototype.QueryUrlString = function(name) {
  var reg = new RegExp("(^|&|\\?)" + name + "=([^&]*)(&|$)", "i");
  var r;
  try {
    r = unescape(this.slice().match(reg)[2]);
  } catch (e) {
    r = null;
  }
  if (r != null) return unescape(r);
  return null;
};

/**
 * 获取当前路径的参数
 * @param name
 */
function $PageUrlParam(name) {
  return window.location.href.QueryUrlString(name);
}

//升序
Array.prototype.sortAsce = function(key) {
  return this.sort(function(a, b) {
    return a[key] > b[key] ? 1 : -1;
  });
};
//降序
Array.prototype.sortAsc = function(key) {
  return this.sort(function(a, b) {
    return a[key] < b[key] ? 1 : -1;
  });
};

/**
 * 模板渲染 依赖template-web.js
 * @param {*} opts.el 模板id
 * opts.data 渲染数据
 */
$.fn.templateRender = function(opts) {
  this.html(template(opts.el, opts.data)).fadeIn();
};

/**
 * 二维数据转换成 树形
 * @param {*} data
 * @param {*} parent_id
 */
function toTree(data, parent_id) {
  var tree = [];
  var temp;
  for (var i = 0; i < data.length; i++) {
    if (data[i].fatherid == parent_id) {
      if (temp.length > 0) {
        obj.children = temp;
      }
      tree.push(obj);
    }
  }
  return tree;
}
